import re

from bot.enterprise_wechat_gpt.test_case.transfer_judge_case import *
from bot.enterprise_wechat_gpt.agent.extract_user_situation import *
from bot.enterprise_wechat_gpt.util.id_distributor import distribute


class TransferJudgeAgent(LLMAgent):
    prompt_template = """
角色：你是京东金融福利推荐官的AI助手，你推荐的产品包括金条、信用卡、企业主贷。
任务：分析你和用户的对话记录，判断当前是否需要转接给人工。

需要转人的情况包括：
1. 
    - 用户明确表示对信用卡感兴趣：判断用户说的话对信用卡是否感兴趣（包括询问信用卡怎么申请、已经申请了），如果感兴趣就转人。排除这种情况：如果京东金融福利推荐官推荐了信用卡，但是用户没有接着聊信用卡就不用转人。
    - 理财产品
    - 用户提到其他公司或者平台的金融产品：比如用户说“我在其他银行、平台的利率更低”、“我在拍拍贷有50000额度”
    - AI让用户去其他平台借款：比如你说"您可以去其他平台借款哦~"、"您可以去支付宝看看哦~"

2. 优惠券、折扣券、免息券：
    - 用户询问优惠券、免息券、折扣券相关问题且系统后台显示有优惠券就转人：用户问有什么优惠、有优惠吗、有免息吗、什么7折优惠、免息券怎么用、借款有优惠吗就表示有用款意向，且系统后台显示用户有优惠券
    - 用户询问是否有活动且系统后台显示有优惠券就转人：这个活动一般指优惠活动，所以也和优惠券有关，且系统后台显示用户有优惠券
    - AI表示帮用户申请金条借款优惠券：因为AI目前没有申请优惠券的能力，所以如果AI说申请优惠券就转人。比如你说"我可以尽力、尝试帮您申请优惠券"、"我这边马上为您申请优惠券"转人。这种情况排除：用户当前没有优惠券，但是可以通过借款获得下次优惠，这种情况不转人。
    - AI表示会通知用户优惠券申请结果：比如"优惠券申请一般会在1个工作日内处理好~到时候我会第一时间通知您"
    - AI回复申请优惠券成功

3. 用户产生消极的情绪态度：
    - 投诉、谩骂、情绪激动
    - 怀疑诈骗、担心诈骗、怀疑有人冒充客服

4. AI言辞不当：
    - 骂人、不文明用语
    
5. 以贷还贷：用户逾期，AI让用户申请其他信贷产品周转还款，其他信贷产品包括金条、信用卡、企业主贷
    - AI让用户申请金条还款
    - AI让用户申请信用卡还款
    
6. 其他：
    - 用户说要去找人工客服
    - AI回复自己是AI、人工智能、虚拟的、机器人、智能助理：比如你说"作为一个人工智能"。
    - 想要注销京东金融：用户不想用京东金融了，想要注销账户。
    - 用户想要延期还款

注意：
- 除了以上需要转人的情况之外，其他情况都不需要转人。
- 只要符合以上一种情况就转人

系统后台显示用户是否有优惠券：{has_coupon}
**对话记录**：
```{conversation_history}```

输出格式：
json格式，包含以下字段：
analysis：详细分析步骤，根据上面每一种转人情况一步步思考，分析字数限制在100字以内
transfer_reason：转人原因，如果不转人，该字段为空；如果有多个原因用"；"分割
transfer_flag：是否需要转人，true或false
"""

    prompt_template_self = """
角色：你是京东金融福利推荐官，你推荐的产品包括金条、信用卡、企业主贷。
任务：分析你和用户的对话记录，判断当前是否需要转接给人工。

需要转人的情况包括：
1. 
    - 用户明确表示对信用卡感兴趣：判断用户说的话对信用卡是否感兴趣（包括询问信用卡怎么申请、已经申请了），如果感兴趣就转人。如果京东金融福利推荐官推荐了信用卡，但是用户没有回应就不用转人。
    - 理财产品
    - 用户提到其他公司或者平台的金融产品：比如用户说“我在其他银行、平台的利率更低”、“我在拍拍贷有50000额度”
    - AI让用户去其他平台借款
    
2. 消极的情绪态度：
    - 抱怨、不满、不爽、不高兴
    - 投诉、谩骂、情绪激动
    - 怀疑诈骗、担心诈骗、怀疑有人冒充客服
    - 不耐烦

3. 发截图
    - 用户要求发截图
    - AI要求用户发截图
    
4. 优惠券：
    - AI表示帮用户申请金条借款优惠券：因为AI目前没有申请优惠券的能力，所以如果AI说申请优惠券就转人。比如你说"我可以尽力、尝试帮您申请优惠券"、"我这边马上为您申请优惠券"转人。
    - AI表示会通知用户优惠券申请结果：比如"优惠券申请一般会在1个工作日内处理好~到时候我会第一时间通知您"
    - AI回复申请优惠券成功

5. 其他：
    - 用户说要去找人工客服
    - AI回复自己是AI、人工智能、虚拟的、机器人、智能助理：比如你说"作为一个人工智能"
    - 想要注销京东金融：用户不想用京东金融了，想要注销账户。

注意：
- 除了以上需要转人的情况之外，其他情况都不需要转人。
- 只要符合以上一种情况就转人

**对话记录**：
```{conversation_history}```

输出格式：
key-value格式，包含以下字段：
分析步骤：详细分析步骤，根据上面每一种转人情况一步步思考，分析字数限制在140字以内###是否转人：是否需要转人，是或否
key-value之间用":"分割，多个key-value之间用"###"分割。
"""

    def __init__(self, conversation_history, has_coupon=False):
        self.conversation_str = '\n###'.join([list(d.keys())[0] + ':' + list(d.values())[0] for d in conversation_history])
        self.prompt = self.prompt_template.format(conversation_history=self.conversation_str, has_coupon='是' if has_coupon else '否')
        super().__init__(self.prompt)


async def judge_transfer(conversation_history, has_coupon=False):
    user_id = local_data.user_id
    transfer_judge = TransferJudgeAgent(conversation_history, has_coupon)
    if distribute(user_id, r=10):
        res = await transfer_judge.achat_with_azure_gpt4(temperature=0, agent_name='转人判断')
        logging.info(f"userId:[{user_id}] [azure-gpt-4] 转人判断 原始输出结果: \n{res}")
    else:
        res = await transfer_judge.chat_with_gpt(temperature=0, agent_name='转人判断')
        logging.info(f"userId:[{user_id}] [第三方代理] 转人判断 原始输出结果: \n{res}")
    res = await parse_res_for_json(res, user_id)
    return res


async def parse_res(res, user_id):
    try:
        analysis_steps = re.findall(r'分析步骤：(.*?)###', res, re.DOTALL)
        transfer_decision = re.search(r'###是否转人：(是|否)', res).group(1)
        obj = {'transfer_reason': analysis_steps[0].strip(), 'transfer_flag': True if transfer_decision == '是' else False}
        logging.info(f"userId:[{user_id}] res:{obj}")
    except Exception as e:
        obj = {'transfer_flag': False, 'transfer_reason': ''}
        logging.warning(f"userId:[{user_id}] Agent5 Transfer_Judge 解析返回失败 e: {e}")
    return obj


async def parse_res_for_json(res, user_id):
    try:
        if type(res) == str and res != 'abandon':
            res = json.loads(res)
        else:
            res = {'transfer_flag': False, 'transfer_reason': ''}
    except Exception as e:
        logging.warning(f"userId:[{user_id}] Agent5 Transfer_Judge 解析json失败 e: {e}")
        # 目前json解析失败的都是这种 ```json ```格式的字符串
        try:
            json_str = str(res).replace("```json", "").replace("```", "")
            res = json.loads(json_str)
        except:
            logging.warning(f"userId:[{user_id}] Agent5 Transfer_Judge 解析json失败 第二次失败 e: {e}")
            res = {'transfer_flag': False, 'transfer_reason': ''}
    return res


if __name__ == '__main__':
    history = parse_history(dialogue_text1)
    # history = filter_not_text(history)
    # history = [{'京东金融福利推荐官': '加入福利群领更多优惠:每日领京豆、优惠券、话费券等 \x02\x01 ·', 'msg_type': 'link', 'msgtime': 1700464789}, {'京东金融福利推荐官': '您好，我是您的【专属】京东金融福利推荐官[玫瑰]~\n京东金融加微用户专属福利来啦~\n\n现在申请京东金条，可享受专属借款优惠，最高20万，年利率最低9.1%，先到先得\n本月借款有机会享受【降息】权益，使用此官方链接【http://3.cn/10dzS2-jA 】查看目前贷款利率并可直接贷款\n（具体以系统审核为准）\n------------\n戳：https://3.cn/j/17-E1Bv9 领会员权益~\n\n【温馨提示】\n京东金融注重保护客户隐私，如接收到“京东金融”名义的电话或不明链接：报出您电话号码、索要个人信息、让您转账汇款或下载其他app等均为诈骗，请勿相信并拨打110报警。', 'msg_type': 'text', 'msgtime': 1700464789}, {'用户': '你好', 'msg_type': 'text', 'msgtime': 1700475241}, {'京东金融福利推荐官': '目前有金条借款优惠活动，需要办理吗？🎉', 'msg_type': 'text', 'msgtime': 1700475268}, {'用户': '我了银行卡冻结了，我今天让我老婆帮我还了这期分期了，按照京东金条的要求已上传了，', 'msg_type': 'text', 'msgtime': 1700475350}, {'京东金融福利推荐官': '另外，如果您最近有资金需求，可以考虑使用金条借款，现在还有优惠活动进行中。不过，请确保您的银行卡问题已解决以便顺利还款。您可以通过官方链接【http://3.cn/10dzS2-jA】查看和管理您的金条贷款事宜。🌟', 'msg_type': 'text', 'msgtime': 1700475395}, {'京东金融福利推荐官': '由于您的银行卡冻结，您已经采取了线下还款方式，上传了相关证明，这是非常正确的操作。请注意查看京东金融官方通知，确认还款已入账。一般来说，这个过程需要3-5个工作日。如果您有急用资金，可以考虑使用其他可用的银行卡或小金库来做还款，以免影响您的信用记录哦。🛡️', 'msg_type': 'text', 'msgtime': 1700475396}, {'用户': '好的，', 'msg_type': 'text', 'msgtime': 1700475451}, {'用户': '我临时冻结一个月', 'msg_type': 'text', 'msgtime': 1700475463}, {'京东金融福利推荐官': '既然银行卡冻结了一个月，建议您在这段时间能否考虑使用其他银行卡还款，或尝试将资金转入小金库后通过小金库还款，这样避免逾期影响信用。', 'msg_type': 'text', 'msgtime': 1700475498}, {'京东金融福利推荐官': '同时，如有其他财务需求也可以告诉我，我这边会根据您的情况提供合适的建议。', 'msg_type': 'text', 'msgtime': 1700475498}, {'用户': '全部冻结了我了卡', 'msg_type': 'text', 'msgtime': 1700475526}, {'京东金融福利推荐官': '之后，记得联系京东金融提供资料，以确保还款准确入账。同时，如果未来解冻后有资金需求，可以随时通过金条借款，我们为您提供贴心的服务。', 'msg_type': 'text', 'msgtime': 1700475556}, {'京东金融福利推荐官': '既然您的所有银行卡都冻结了，可以选择线下还款的方式，通过朋友帮您进行打款。', 'msg_type': 'text', 'msgtime': 1700475557}, {'用户': '我已经按照京东金条线下还款要求还了，', 'msg_type': 'text', 'msgtime': 1700475570}, {'用户': '已经还了，估计两三天应该成功了吧', 'msg_type': 'text', 'msgtime': 1700475592}, {'京东金融福利推荐官':'很好，您已按照要求进行了线下还款。请留意京东金融的官方通知，一旦还款成功，您的账户状态会及时更新。如果后续有其他借款需求，欢迎随时联系我，我会为您提供帮助。🌈'}]
    loops = asyncio.get_event_loop()
    # tasks = [get_user_question(history[:-1]), get_user_situation(history[:-1])]
    # us = loops.run_until_complete(get_user_situation(history[:-1]))
    # uq, us = "", ""
    us = ''

    results = loops.run_until_complete(judge_transfer(history))



